package com.ww.jmh;

import org.openjdk.jmh.annotations.*;
import org.openjdk.jmh.runner.Runner;
import org.openjdk.jmh.runner.RunnerException;
import org.openjdk.jmh.runner.options.Options;
import org.openjdk.jmh.runner.options.OptionsBuilder;

import java.util.Map;
import java.util.concurrent.TimeUnit;

/**
 * Scope.Benchmark：全基准共享
 * 1.规则：同一类型的状态对象在所有工作线程之间共享，整个基准测试中只有一个实例
 * 2.Setup/TearDown：初始化和清理共享资源（仅执行一次），其他线程不参与
 * 3.适用场景：测试“全局共享资源”的性能（如单例对象、静态资源），或验证线程安全的全局组件
 */
@State(Scope.Benchmark)
public class BenchmarkScopeDemo {
    // 共享的ConcurrentHashMap（线程安全）
    private Map<String, Integer> sharedMap;

    // Setup：初始化共享资源（仅执行一次）
    @Setup(Level.Trial) // Trial：整个测试周期（所有迭代）前执行一次
    public void setup() {
        sharedMap = new java.util.concurrent.ConcurrentHashMap<>();
        System.out.println("Benchmark Setup: 初始化全局共享Map");
    }

    @TearDown(Level.Trial)
    public void tearDown() {
        sharedMap.clear();
        System.out.println("Benchmark TearDown: 清空全局共享Map");
    }

    @Benchmark
    @BenchmarkMode(Mode.Throughput) // 吞吐量模式：每秒操作数
    @OutputTimeUnit(TimeUnit.MILLISECONDS)
    public void testConcurrentMapPut() {
        sharedMap.put(Thread.currentThread().getName(), (int) System.currentTimeMillis() % 1000);
    }

    public static void main(String[] args) throws RunnerException {
        Options opts = new OptionsBuilder()
                .include(BenchmarkScopeDemo.class.getSimpleName())
                .threads(4) // 4个工作线程
                .forks(1) // 1个进程
                .warmupIterations(2) // 预热2轮
                .measurementIterations(3) // 测量3轮
                .build();
        new Runner(opts).run();
    }
}
